10509. Обмануть Мистера Фреймана

 

Мистер Фрейман – известный музыкант, учитель и Нобелевский лауреат. Однажды он в уме смог вычислить значение кубического корня из числа 1729.03 до трех знаков после запятой, получив 12.002.

Приближенно вычислить квадратный корень можно следующим образом. Пусть  = a + dx, где a – целое, 0 £ dx < 1. Тогда n = (a + dx)2 = a2 + 2 * a * dx + (dx)2. Если значение dx мало, то при приближенном вычислении слагаемое (dx)2 можно не учитывать, то есть можно положить что n = a2 + 2 * a * dx. Здесь dx = (na2) / 2a. В задаче требуется построить аналогичную схему для вычисления приближенного значения кубического корня.

 

Вход. Каждая строка содержит действительное значение n в промежутке от 0 до 1000000 включительно. Последняя строка содержит 0 и не обрабатывается.

 

Выход. Для каждого теста вывести приближенное значение , округленное до четырех цифр после десятичной точки.

 

Пример входа

1729.0300
64.0000
63.9990
0

 

Пример выхода

12.0024
4.0000

4.3703

 

 

РЕШЕНИЕ

математика

 

Анализ алгоритма

Если  = a + dx, то n = (a + dx)3 = a3 + 3 * a2 * dx + 3 * a * (dx)2 + (dx)3. Если отбросить второе и третье слагаемое в правой части, то приближенно имеем равенство n = a3 + 3 * a2 * dx. Отсюда dx = (na3) / 3a2. При этом a = .

 

Пример

В первом тесте n = 1729.03, значит a = . = 12. dx = (1729.03 – 123) / (3 * 122) = (1729.03 – 1728) / 432 = 1.03 / 432 = 0.0001 * 10300 / 432 = 0.0024. Откуда  = a + dx = 12 + 0.0024 = 12.0024.

 

Реализация алгоритма

Читаем входное значение n, вычисляем a =  =  = . Последнее выражение на языке С запишется как (int)(exp(log(n)/3) + 0.0000001). Перед взятием целой части следует добавить к exp(log(n)/3) некое малое значение eps = 0.0000001, чтобы избежать ошибки округления. Находим значение dx и выводим a + dx с четырьмя знаками после десятичной точки.

 

while(scanf("%lf",&n),n)

 {

   a = (int)(exp(log(n)/3) + 0.0000001);

   dx = (n - a * a * a) / (3 * a * a);

   printf("%.4lf\n",a+dx);

 }